package Negocios;

import CDB.Detalleproducto;
import CDB.PersonFactory;
import CDB.Producto;
import CDB.Subcategoria;
import java.sql.Time;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 *
 * @author ISC Erick
 */
public class ControlProductDetail {

    private SessionFactory sessionFactory = null;

    public ControlProductDetail() {
    }

    public List selectAll() {
        List list = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los empleados
            list = session.createQuery("from Detalleproducto pd").list();
            session.close();
            //Retorno la lista con todos los empleados
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
        return list;
    }

    public List selectAllByProduct(int id) {
        List list = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los detallesProducto con un id de producto especifico
            list = session.createQuery("from Detalleproducto pd where pd.producto.idproducto = " + id + " order by pd.producto.idproducto desc").list();
            session.close();
            //Retorno la lista con todos los detallesProducto
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
        return list;
    }

    public List selectByProductTipe(String tipo, String nomProducto) {
        List listDetalle = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los detallesProducto con un id de producto especifico
            listDetalle = session.createQuery("from Detalleproducto dp where dp.tipo = '" + tipo + "' and dp.producto.nombre = '" + nomProducto + "'").list();
            session.close();
            //Retorno la lista con todos los detallesProducto
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
        return listDetalle;
    }

    public boolean isProductWithType(String tipo, String nomProducto) {
        boolean isTipo = false;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los detallesProducto con un id de producto especifico
            if (session.createQuery("from Detalleproducto dp where dp.tipo = '" + tipo + "' and dp.producto.nombre = '" + nomProducto + "'").list().size() > 0) {
                isTipo = true;
            }
            session.close();
            //Retorno la lista con todos los detallesProducto
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
        return isTipo;
    }

    public List selectAllBySubcategory(int id) {
        List list = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los detallesProducto con un id de producto especifico
            list = session.createQuery("from Detalleproducto pd where pd.subcategoria.idsubcategoria=" + id).list();
            session.close();
            //Retorno la lista con todos los detallesProducto
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
        return list;
    }

    public Detalleproducto selectOne(int id) {
        Detalleproducto detPro = null;
        try {
            Session session = createSession();
            detPro = (Detalleproducto) session.createQuery("from Detalleproducto pd where pd.iddetalleproducto=" + id).list().get(0);
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error Dany.",
                    0);
        }
        return detPro;
    }

    public List selectOneByProductSubcategory(int producto, int subcategoria) {
        try {
            Session session = createSession();
            List dProduct;
            dProduct = session.createQuery("from Detalleproducto pd where pd.producto.idproducto=" + producto + "and pd.subcategoria.idsubcategoria=" + subcategoria).list();
            session.close();
            return dProduct;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
            return null;
        }
    }

    public void add(Producto producto, Time tiempoPreparacion, String tipo,
            Subcategoria subcategoria, int consumo, float costo) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Detalleproducto detalleProducto = new Detalleproducto();

            //construir el empleado apartir de los datos proporcionados
            detalleProducto.setProducto(producto);
            detalleProducto.setConsumo(consumo);
            detalleProducto.setTiempoprepacion(tiempoPreparacion);
            detalleProducto.setTipo(tipo);
            detalleProducto.setSubcategoria(subcategoria);
            detalleProducto.setCosto(costo);
            //Guardar la el empleado mandado
            session.save(detalleProducto);

            //Si no a ocurrido un error 
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }

    }

    public void add(Producto producto, Time tiempoPreparacion, String tipo,
            int consumo, float costo) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Detalleproducto detalleProducto = new Detalleproducto();

            //construir el empleado apartir de los datos proporcionados
            detalleProducto.setProducto(producto);
            detalleProducto.setConsumo(consumo);
            detalleProducto.setTiempoprepacion(tiempoPreparacion);
            detalleProducto.setTipo(tipo);

            detalleProducto.setCosto(costo);
            //Guardar la el empleado mandado
            session.save(detalleProducto);

            //Si no a ocurrido un error 
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }

    }

    public void update(int id, Producto producto, Time tiempoPreparacion, String tipo,
            Subcategoria subcategoria, int consumo, float costo) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Detalleproducto detalleProducto = (Detalleproducto) session.load(Detalleproducto.class,
                    new Integer(id));

            //construir el empleado apartir de los datos proporcionados
            detalleProducto.setProducto(producto);
            detalleProducto.setConsumo(consumo);
            detalleProducto.setTiempoprepacion(tiempoPreparacion);
            detalleProducto.setTipo(tipo);
            detalleProducto.setSubcategoria(subcategoria);
            detalleProducto.setCosto(costo);
            //Operacion hibernate para borrar un registro
            session.update(detalleProducto);

            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
    }

    public void delete(int id) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();

            //Operacion hibernate para borrar un registro
            Detalleproducto detalleProducto = new Detalleproducto();
            detalleProducto.setIddetalleproducto(id);
            session.delete(detalleProducto);

            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
    }

    public void deleteByDetalle(Detalleproducto detalle) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            session.delete(detalle);
            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
    }

    public void deleteByIDProducto(int id) {
        try {
            Session session = createSession();
            List listDetalle = selectAllByProduct(id);
            for (int i = 0; i < listDetalle.size(); i++) {
                Transaction tx = session.beginTransaction();
                //Operacion hibernate para borrar un registro
                Detalleproducto detalleProducto = (Detalleproducto) listDetalle.get(i);
                session.delete(detalleProducto);
                //Si no ocurrio error hago comit y termino la session
                tx.commit();
            }
            session.close();
        } catch (org.hibernate.StaleStateException error) {
            JOptionPane.showMessageDialog(null, "error: " + error, "Ha ocurrido un error.",
                    0);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
    }

    public void deleteByIDProducto(Producto producto, String type) {
        try {
            Session session = createSession();
            List listDetalle = selectByProductTipe(type, producto.getNombre());
            for (int i = 0; i < listDetalle.size(); i++) {
                Transaction tx = session.beginTransaction();
                //Operacion hibernate para borrar un registro
                Detalleproducto detalleProducto = (Detalleproducto) listDetalle.get(i);
                session.delete(detalleProducto);
                //Si no ocurrio error hago comit y termino la session
                tx.commit();
            }
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
    }

    public Session createSession() {

        Session session = null;
        try {
            //creando la nueva session para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de detalle de producto.", "Error al crear Session",
                    0);
            session.close();
        }
        return session;
    }
}
